/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

package Mongo;

import ConexionesBD.conexionBDMongo;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.jdbc.OracleResultSet;

/**
 * Clase encargada de las metaconsultas 
 * @author diegoojedagarcia
 */
public class CreaConsultasMongo {
    private conexionBDMongo cbd;
    private Gson g;
    OracleResultSet rs;

    private final String cons1 = "select distinct nombre from tipo_entidad where nombre NOT IN (select nombre_entidad from participa)";
    private final String cons2 = "select * from tipo_entidad_debil";
    private final String cons3 = "select p1.nombre_entidad as p1ent, p2.nombre_entidad as p2ent, p1.nombre_esquema as p1esq, p2.nombre_esquema as p2esq, p1.papel as p1pap, p2.papel as p2pap, p1.nombre_relacion as p1rel, p2.nombre_relacion as p2rel from participa p1, participa p2 where p1.nombre_relacion = p2.nombre_relacion and p1.papel <> p2.papel";
    private final String cons4 = "select nombre_relacion,nombre_esquema,count(nombre_entidad) as numero_Entidades from participa group by (nombre_relacion,nombre_esquema)";
    private final String cons5 = "select nombre_entidad, count(papel) as contador from participa group by nombre_entidad order by count(papel) DESC";
    
    /**
     * Constructor de la clase
     */
    public CreaConsultasMongo() {
        FileWriter fichero = null;
        try {
            fichero = new FileWriter("consultasMongo.js");
            PrintWriter pw = new PrintWriter(fichero);
            ArrayList<Map<String, Object> > tab;
            g = new GsonBuilder().setPrettyPrinting().create();
            cbd = new conexionBDMongo();
            cbd.conectar();
            pw.append("db.cons1.drop();\n");
            pw.append("db.cons2.drop();\n");
            pw.append("db.cons3.drop();\n");
            pw.append("db.cons4.drop();\n");
            pw.append("db.cons5.drop();\n");
            
            rs = cbd.obtenerResultSet(cons1);
            tab = cons1ResultSetToListMap(rs);
            pw.append("db.cons1.insert(");
            pw.append(g.toJson(tab));
            pw.append(");\n");
            
            rs = cbd.obtenerResultSet(cons2);
            tab = cons2ResultSetToListMap(rs);
            pw.append("db.cons2.insert(");
            pw.append(g.toJson(tab));
            pw.append(");\n");
            
            rs = cbd.obtenerResultSet(cons3);
            tab = cons3ResultSetToListMap(rs);
            pw.append("db.cons3.insert(");
            pw.append(g.toJson(tab));
            pw.append(");\n");
            
            rs = cbd.obtenerResultSet(cons4);
            tab = cons4ResultSetToListMap(rs);
            pw.append("db.cons4.insert(");
            pw.append(g.toJson(tab));
            pw.append(");\n");
            
            rs = cbd.obtenerResultSet(cons5);
            tab = cons5ResultSetToListMap(rs);
            pw.append("db.cons5.insert(");
            pw.append(g.toJson(tab));
            pw.append(");\n");
            
            
        } catch (IOException ex) {
            Logger.getLogger(CreaConsultasMongo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(CreaConsultasMongo.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally{
            if (fichero != null){
                try {
                    fichero.close();
                } catch (IOException ex) {
                    Logger.getLogger(CreaConsultasMongo.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
    
    
    /**
     * Método que transforma la primera consulta a lenguaje Mongo
     * @param rs Objeto con el resultado de la primera consulta
     * @return ArrayList de map<String,Object>
     * @throws SQLException 
     */
    private ArrayList<Map<String, Object> > cons1ResultSetToListMap (OracleResultSet rs) throws SQLException{
        Map<String, Object> row;
        ArrayList<Map<String, Object > > tabla = new ArrayList<Map<String, Object>>();
        while (rs.next()){
            row = new HashMap<String, Object>();
            row.put("nombre_entidad", rs.getString("nombre"));
            tabla.add(row);
        }
        rs.close();
        return tabla;
    }
    
    /**
     * Método que transforma la segunda consulta a lenguaje Mongo
     * @param rs Objeto con el resultado de la segunda consulta
     * @return ArrayList de map<String,Object>
     * @throws SQLException 
     */
    private ArrayList<Map<String, Object> > cons2ResultSetToListMap (OracleResultSet rs) throws SQLException{
        Map<String, Object> row;
        ArrayList<Map<String, Object > > tabla = new ArrayList<Map<String, Object>>();
        while (rs.next()){
            row = new HashMap<String, Object>();
            row.put("nombre", rs.getString("nombre"));
            row.put("nombre_esquema", rs.getString("nombre_esquema"));
            row.put("nombre_rel_identificacion", rs.getString("nombre_tipo_rel_ident"));
            tabla.add(row);
        }
        rs.close();
        return tabla;
    }
    
    /**
     * Método que transforma la tercera consulta a lenguaje Mongo
     * @param rs Objeto con el resultado de la tercera consulta
     * @return ArrayList de map<String,Object>
     * @throws SQLException 
     */
    private ArrayList<Map<String, Object> > cons3ResultSetToListMap (OracleResultSet rs) throws SQLException{
        Map<String, Object> row;
        ArrayList<Map<String, Object > > tabla = new ArrayList<Map<String, Object>>();
        while (rs.next()){
            row = new HashMap<String, Object>();
            row.put("p1entidad", rs.getString("p1ent"));
            row.put("p1relacion", rs.getString("p1rel"));
            row.put("p1papel", rs.getString("p1pap"));
            row.put("p1esquema", rs.getString("p1esq"));
            row.put("p2entidad", rs.getString("p2ent"));
            row.put("p2relacion", rs.getString("p2rel"));
            row.put("p2papel", rs.getString("p2pap"));
            row.put("p2esquema", rs.getString("p2esq"));
            tabla.add(row);
        }
        rs.close();
        return tabla;
    }
    
    /**
     * Método que transforma la cuarta consulta a lenguaje Mongo
     * @param rs Objeto con el resultado de la cuarta consulta
     * @return ArrayList de map<String,Object>
     * @throws SQLException 
     */
    private ArrayList<Map<String, Object> > cons4ResultSetToListMap (OracleResultSet rs) throws SQLException{
        Map<String, Object> row;
        ArrayList<Map<String, Object > > tabla = new ArrayList<Map<String, Object>>();
        while (rs.next()){
            row = new HashMap<String, Object>();
            row.put("nombre_relacion", rs.getString("nombre_relacion"));
            row.put("nombre_esquema", rs.getString("nombre_esquema"));
            row.put("entidades_relacionadas", rs.getInt("numero_Entidades"));
            tabla.add(row);
        }
        rs.close();
        return tabla;
    }
    
    /**
     * Método que transforma la quinta consulta a lenguaje Mongo
     * @param rs Objeto con el resultado de la quinta consulta
     * @return ArrayList de map<String,Object>
     * @throws SQLException 
     */
    private ArrayList<Map<String, Object> > cons5ResultSetToListMap (OracleResultSet rs) throws SQLException{
        Map<String, Object> row;
        ArrayList<Map<String, Object > > tabla = new ArrayList<Map<String, Object>>();
        while (rs.next()){
            row = new HashMap<String, Object>();
            row.put("nombre_entidad", rs.getString("nombre_entidad"));
            row.put("contador", rs.getInt("contador"));
            tabla.add(row);
        }
        rs.close();
        return tabla;
    }
}
